/**
  ******************************************************************************
  * @file    main.c
  * @author  ashuai0110
  * @version V1.0
  * @date    2024-01-28
  * @brief   使用举例-环形缓冲区
  *
  ******************************************************************************
  * @attention
  *
  * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^
  * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module
  *
  ******************************************************************************
  */

/* 包含头文件-----------------------------------------------------------------*/
#include "stm32f10x.h"
#include "usart.h"

#include "ring_buffer.h"

/* 私有宏定义-----------------------------------------------------------------*/

/* 私有类型定义---------------------------------------------------------------*/

/* 私有变量-------------------------------------------------------------------*/
static ring_buffer_t testRB; /* 环形缓冲区管理实例 */
static uint8_t testBuf[50];  /* 实际缓冲区 */

/* 全局变量-------------------------------------------------------------------*/

/* 私有函数原型---------------------------------------------------------------*/


/**
  * @brief  串口中断函数
  *
  * @param  None
  *
  * @retval None
  */
void USART1_IRQHandler(void)
{
    static uint8_t data, ret;
    
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        data = USART_ReceiveData(USART1);
        /* 向环形缓冲区写入数据 */
        ret = ring_buffer_write(&testRB, &data, 1);
        if(0 == ret)
        {
            WARN_LOG("ring buffer write full");
        }
        
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
}

/**
  * @brief  main
  */
int main(int argc, char *argv[])
{
    VERSION_LOG("example-ring_buffer", 1, 0, 0);
    
    /* 串口初始化 */
    usart1_init_config(115200);
    
    /* 环形缓冲区初始化 */
    ring_buffer_init(&testRB, testBuf, sizeof(testBuf));

    while(1)
    {
        /* 解析出串口输入结尾是\r\n的数据 */
        static uint8_t recData[50];
        static uint8_t dataCnt = 0;
        uint8_t buf[20];
        uint8_t len;
        /* 从环形缓冲区读取数据 */
        len = ring_buffer_read(&testRB, buf, sizeof(buf));

        /* 以实际读取数量逐个处理 */
        for(uint8_t cnt = 0; cnt < len; cnt++)
        {
            /* 遇结束符则打印消息 */
            if('\r' == buf[cnt] || '\n' == buf[cnt])
            {
                recData[dataCnt] = '\0';
                if(0 < dataCnt)
                {
                    DEBUG_LOG("rec:%s", recData);
                }
                dataCnt = 0;
            } /* 否则继续存储 */
            else
            {
                recData[dataCnt++] =  buf[cnt];
                if(dataCnt >= sizeof(recData)) { dataCnt = 0; }
            }
        }
    }
}

